/**
 * weapp-js v1.7.1(2021-4-16)
 * https://codeup.aliyun.com/motigo/motigo/weapp_base
 * Copyright@ 2021 Motigo, Inc.
 * 
 */
import mox from "../index.js"
import { basicLock } from "../libs/lock.js";

/*
    基础录音组件：
        支持UI自定义、长按录音和代码调用式录音

        参数说明：
            mode:工作模式
                - touch 表示需要响应用户长按事件，长按触发录音
                - 其他表示不需要响应用户长按事件，通过接口start和stop录音

        工作模式介绍：
            1、长按录音：
                支持UI自定义，调用方通过 start 接口设置录音参数，等待用户按下录音组件开始录音，松开手以后停止录音
            2、代码调用式录音：
                没有UI，通过 start 接口传入录音参数立即开始录音，通过 stop 接口停止录音

        使用说明：
            长按录音模式下，录音的开始与停止由用户的touch行为决定，调用方只能通过start接口提前设置录音参数，不支持stop接口
            非长按录音模式下，录音的开始与停止由调用方代码决定，不响应用户的长按行为
*/

Component({
    properties: {
        sid:{
            type:String,
            value:""
        },
        mode:{
            type:String,
            value:"none"
        }
    },
    detached(){
        if(this.properties.sid && typeof this.properties.sid == "string"){
            // 注销
            mox && mox.recorder && mox.recorder.registerNormalRecorderOff(this.properties.sid)
        }
    },
    ready(){
        this.recordOptions = null;
        this.rcd = mox.recorder.getBasicRecorderManager()
        // this.rcd.checkAuthorizeAndAskAuthorizeUtilSuccess()
        if(this.properties.sid && typeof this.properties.sid == "string"){
            // 登记
            mox && mox.recorder && mox.recorder.registerNormalRecorder(this.properties.sid,this)
        }

        this.locks = {
            "start": new basicLock(),
            "stop": new basicLock()
        }
    },
    methods: {
        start(options){
            /*
                对外接口
            */
            this.locks.start.unlock()
            this.locks.stop.unlock()
            if(this.useTouchMode()){
                // 长按录音模式，设置录音参数，等待用户长按行为
                this.recordOptions = options
            }
            else{
                // 非长按录音模式，立即开始录音
                this.wrapper(options)
            }
        },
        stop(){
            /*
                对外接口，在工作模式不是长按录音时有效
            */
            this.useTouchMode() == false && this.rcd.stop()
        },
        useTouchMode(){
            /*
                是否式长按录音模式
            */
            return this.properties.mode == "touch"
        },
        beginTouchRecord(){
            /*
                用户长按开始，只工作在长按录音模式、提前设置了录音参数的情况下有效
            */
            if(this.useTouchMode() && this.recordOptions ){
                if(!this.locks.start.lock()) return;
                this.recordOptions.rid = Math.random().toString()
                let options = Object.assign({},this.recordOptions)
                if(this.recordOptions.beforeStart && this.recordOptions.beforeStart instanceof Function){
                    /*
                        如果用户需要在录音前做点什么，比如说播放点录音开始的提示音，但是不想提示音出现在用户的录音中

                        约定 beforeStart 返回 Promise对象，否则不会等待，会立即开始录音
                    */
                    let p = this.recordOptions.beforeStart()
                    if(p instanceof Promise){
                        p.then(()=>{
                            this.wrapper(options)
                            if(this.locks.stop.isLocked()){
                                /*
                                    录音前的回调还没有执行完，用户就停止了
                                */
                                this.rcd.stop()
                            }
                        })
                    }
                    else{
                        this.wrapper(options)
                    }
                }
                else {
                    this.wrapper(options)
                }
            }
        },
        endTouchRecord(){
            /*
                用户长按结束，只工作在长按录音模式
            */
            this.useTouchMode() && this.locks.stop.lock() && this.rcd.stop()
        },
        wrapper(options){
            /*
                真正开始录音的内部接口，不对外使用
            */
            this.rcd.start({
                sample:options.sample || 16000,
                format:options.format || "mp3",
                channel:options.channel || 1,
                bitrate:options.bitrate || 96000,
                duration:options.duration,
                onStart:()=>{
                    options && options.onStart && options.onStart()
                },
                complete:(res)=>{
                    if(this.recordOptions && this.recordOptions.rid && options.rid == this.recordOptions.rid){
                        this.recordOptions = null;
                    }
                    options && options.complete && options.complete(res)
                }
            })
        }
    }
})
